/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package quanlinganhang.dto;

import java.sql.CallableStatement;
import java.sql.SQLException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import quanlinganhang.dao.AccountDAO;
import quanlinganhang.dao.LoginDAO;
import quanlinganhang.dao.Parameter;
import quanlinganhang.dao.SqlDAOHelper;
import quanlinganhang.view.ManageUser;

/**
 * Class chuyển khoản
 *
 * @author phamduong
 */
public class TranferDTO {

    private String magd;
    private String sotkchuyen;
    private String sotkden;
    private long sotien;
    private Date ngaychuyen;
    private String ghichu;

    public TranferDTO() {
        magd = "0";
        sotkchuyen = "";
        sotkden = "";
        sotien = 0;
        ngaychuyen = new Date();
        ghichu = "";
    }

    /**
     * Cho phép người dùng chuyển tiền
     *
     * @param soTien số tiền cần rút
     * @return Chuổi thông báo
     */
    public String Tranfer(String sotkDen, long soTien, String accNo) {
        try {
            //sotkchuyen = "" + LoginDAO.User.getId();
            AccountDTO tkChuyen = AccountDAO.GetAccountFormId(accNo);
            sotkchuyen = tkChuyen.getSoTaiKhoan();
            AccountDTO tkDen;
//            RuleDTO rule = new RuleDTO();
//            if (rule.isAvailable(tkChuyen.getSoDuTK(), soTien)) {
//                return "Số tiền chuyển không hợp lệ";
//            }
//
//            if (tkChuyen.getNgayDaoHan().before(ngaychuyen)) {
//                return "Tài khoản đã hết hạn sử dụng";
//            }


            this.sotkden = sotkDen;
            /*
             try {
             tkDen = new AccountDTO(sotkden);
             this.sotkden = tkDen.getSoTaiKhoan();
             } catch (Exception ex) {
             return "Tài khoản đến ko đúng";
             }*/
            // mọi thông tin OK-> chuyển

            // b1: trừ bên chuyển
            sotien = soTien;
            tkChuyen.setSoDuTK(tkChuyen.getSoDuTK() - soTien); // tính số tiền mới
            //AccountDAO.UpdateAccount(tkChuyen);  // cập nhật số tiền

            // b2: cộng bên tk đến
            // tkDen.setSoDuTK(tkDen.getSoDuTK() + soTien);
            // AccountDAO.UpdateAccount(tkDen);

            // b3: viết lại lịch sử giao dịch
            WriteLog();     // ghi lại lịch sử giao dịch

            return "transfer successfull!\nSố tiền: " + sotien;

        } catch (Exception ex) {
            return "Số tài khoản ko đúng hoặc không ghi log được";
        }
    }

    /**
     * Cho phép ADMIN chuyển tiền
     *
     * @param sotkChuyen số tài khoản chuyển đi
     * @param sotkDen số tài khoản đến
     * @param soTien số tiền cần gửi
     * @return thông báo
     */
    public String Tranfer(String sotkChuyen, String sotkDen, long soTien) {
        try {
            sotkchuyen = sotkChuyen;
            AccountDTO tkChuyen = AccountDAO.GetAccountFormId(sotkChuyen);
            AccountDTO tkDen;
//            RuleDTO rule = new RuleDTO();
//            if (rule.isAvailable(tkChuyen.getSoDuTK(), soTien)) {
//                return "Số tiền chuyển không hợp lệ";
//            }
//
//            if (tkChuyen.getNgayDaoHan().before(ngaychuyen)) {
//                return "Tài khoản đã hết hạn sử dụng";
//            }
            this.sotkden = sotkDen;
            tkDen = AccountDAO.GetAccountFormId(this.sotkden);
            // mọi thông tin OK-> chuyển

            // b1: trừ bên chuyển
            sotien = soTien;
            tkChuyen.setSoDuTK(tkChuyen.getSoDuTK() - soTien); // tính số tiền mới
            AccountDAO.UpdateAccount(tkChuyen);  // cập nhật số tiền

            // b2: cộng bên tk đến
            tkDen.setSoDuTK(tkDen.getSoDuTK() + soTien);
            AccountDAO.UpdateAccount(tkDen);

            // b3: viết lại lịch sử giao dịch
            WriteLog();     // ghi lại lịch sử giao dịch

            return "Rút tiền thành công. Số tiền: " + sotien;

        } catch (SQLException | ClassNotFoundException | ParseException ex) {
            Logger.getLogger(TranferDTO.class.getName()).log(Level.SEVERE, null, ex);
            return "Số tài khoản ko đúng";
        }
    }

// ghi log lịch sử giao dịch
    private void WriteLog() {
        List<Parameter> sqlParams = new ArrayList<>();
        try {

            /*
             @magd numeric(18,0),
             @ngayck datetime,
             @sotkgui nvarchar(10),
             @sotknhan nvarchar(10),
             @sotien money,
             --@chiphi money, 
             --@tongcong money, 
             @ghichu nvarchar(255)
             */


            magd = "" + GetCurrentMaGD();

            sqlParams.add(new Parameter("magd", magd));
            //SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
            ngaychuyen = new Date();
            int nam = ngaychuyen.getYear() + 1900;
            String ngay = nam + "-" + ngaychuyen.getMonth() + "-" + ngaychuyen.getDay();
            sqlParams.add(new Parameter("ngayck", ngay));
            sqlParams.add(new Parameter("sotkgui", sotkchuyen));
            sqlParams.add(new Parameter("sotknhan", sotkden));
            sqlParams.add(new Parameter("sotien", sotien));
            sqlParams.add(new Parameter("ghichu", ghichu));
        } catch (Exception ex) {
            System.out.println("" + ex);
        }
        try {

            SqlDAOHelper.ExecuteNonQuery("Insert_ChuyenKhoan", sqlParams);
        } catch (Exception ex) {
            System.out.println("" + ex);
        }

    }

    public static long GetCurrentMaGD() throws ClassNotFoundException, SQLException {
        SqlDAOHelper.OpenConnection();
        CallableStatement cs = SqlDAOHelper.connection.prepareCall("{call MaCK_Current (?)}"); // MaGD_Current
        cs.registerOutParameter("MaCK", java.sql.Types.NVARCHAR);
        cs.executeUpdate();
        long check = cs.getLong("MaCK");
        SqlDAOHelper.CloseConnection();
        return (check + 1);

    }

    public void setGhiChu(String ghiChu) {
        this.ghichu = ghiChu;
    }
}
